package com.example.springboottaskscheduler.controller;
import com.example.springboottaskscheduler.task.CronTaskRunnable;
import com.example.springboottaskscheduler.utils.CronTaskRegistrar;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * Created by IntelliJ IDEA2022.3.2
 * @Author: Tenghw
 * @Date: 2023/05/09  12:56
 * @Description:
 */
@Slf4j
@RestController
@RequestMapping("/scheduled")
public class TestScheduledController {
    @Resource
    private CronTaskRegistrar cronTaskRegistrar;

    /** 获取定时任务列表
     **/
    @GetMapping("/getScheduledTasks")
    public List<CronTaskRunnable> getScheduledTasks() {
        return cronTaskRegistrar.getScheduledTasks();
    }

    /** 添加定时任务
     * @param param param
     * @return java.lang.String
     **/
    @PostMapping("/addCronTask")
    public String addCronTask(@RequestBody Map<String, Object> param) {
        log.info("进入方法：addCronTask-----");
        //自己拿任务参数的逻辑：可以把每个任务保存到数据库，重新启动任务的同时，加载这些任务到任务调度中心
        String taskId = (String) param.get("taskId");
        Integer taskType = (Integer) param.get("taskType");
        String taskName = (String) param.get("taskName");
        Object params = param.get("params");
        //添加任务参数
        CronTaskRunnable task = new CronTaskRunnable(taskId, taskType, taskName, params);
        //注册任务：cron表达式（5s执行一次），可根据业务需求传值
        cronTaskRegistrar.addCronTask(task, "0/5 * * * * ?");
        return "ok";
    }

    /** 根据任务id删除定时任务
     * @param taskId 任务id
     * @return java.lang.String
     **/
    @DeleteMapping("/removeCronTaskByTaskId")
    public String removeCronTaskByTaskId(@RequestParam String taskId) {
        cronTaskRegistrar.removeCronTaskByTaskId(taskId);
        return "ok";
    }

    /** 删除全部任务
     * @return java.lang.String
     **/
    @DeleteMapping("/removeAll")
    public String removeCronTask() {
        cronTaskRegistrar.destroy();
        return "ok";
    }
}
